package net.jcip.examples.chapter6;

import java.util.*;
import static java.util.concurrent.TimeUnit.SECONDS;

/**
 * OutOfTime
 * <p/>
 * Class illustrating confusing Timer behavior
 *
 * @author Brian Goetz and Tim Peierls
 */

public class OutOfTime {
    public static void main(String[] args) throws Exception {
        Timer timer = new Timer();
        timer.schedule(new ThrowTask(), 1);
        /**
         * timer在执行的时候会抛出没有检查的异常，此时会终止定时线程
         * 这种情况下，timer不会恢复线程的执行，而是会错误的认为整个timer都被取消
         * 已经被调度但尚未被执行的Task不会执行，新的Task也不会被调度
         */
        SECONDS.sleep(1);


        /**
         * 由于胃第一个task执行时发生了未经检查的异常，timer已经终止。
         * 再次执行时会发生   Timer already cancelled.
         */
        timer.schedule(new ThrowTask(), 1);
        SECONDS.sleep(5);
    }

    static class ThrowTask extends TimerTask {
        public void run() {
            throw new RuntimeException();
        }
    }
}
